
#include "Plateau.h"


void initPlateau(Plateau *pPlat, const int nbrJoueur)
{
   int i;
   pPlat->niveau = 0;
   pPlat->tab = (Case *) malloc ((pPlat->num_case)*sizeof(Case));
   for (i=0; i<pPlat->num_case;i++)
   {
       initCase(&pPlat->tab[i],nbrJoueur);
   }
}

Plateau * creerPlateau(const int nbrCase, const int nbrJoueur)
{
    Plateau *pPlatNew = (Plateau *) malloc(sizeof(Plateau));

    pPlatNew->num_case = nbrCase;
    initPlateau(pPlatNew,nbrJoueur);
    return pPlatNew;
}

void liberePlateau(Plateau *pPlat)
{
    int i;
    pPlat->niveau = 0;
    for (i=0;i<pPlat->num_case;i++)
    {
        libereCase(&pPlat->tab[i]);
    }
    pPlat->num_case = 0;
    free(pPlat->tab);
    pPlat->tab = NULL;
}

void detruitPlateau(Plateau **ppPlat)
{
    liberePlateau(*ppPlat);
    free(*ppPlat);
    *ppPlat = NULL;
}

void set_niveau(Plateau *pPlat,int niveau)
{
    assert (niveau != 0);
    pPlat->niveau = niveau;
}

int get_niveau(const Plateau *pPlat)
{
    return pPlat->niveau;
}

int get_capacitePlat(Plateau *pPlat)
{
    return pPlat->num_case;
}

int get_poscase(const Plateau *pPlat,const Case * pCase)
{
    int i=0;
  for (i=0;i<=35;i++)
  {
      if(&pPlat->tab[i]==pCase)
      return i;
  }
  return i;
}

void set_case(Plateau *pPlat,int num_case,Case pCase)
{
    assert((num_case>=0) && (num_case<=35));
    pPlat->tab[num_case]=pCase;
}

Case * get_case(const Plateau *pPlat, int num_case)
{
    assert ((num_case>=0) && (num_case<=35));
    return &pPlat->tab[num_case];
}

void repartirCase(Plateau *pPlat)
{
    int i;
    int j;
    GenreCase g;
    const char tab[34]="EEPEPEEEBEPEEEBEPEEEBEPEEEPEPEEEBE";
    setTypeCase(&pPlat->tab[0],rien);
    setTypeCase(&pPlat->tab[pPlat->num_case-1],rien);
    for(i=1;i<pPlat->num_case-1;i++)
    {
        j=i-1;
        if(tab[j] =='E')
            g = exam;
        else if(tab[j]=='B')
            g = bonus;
        else if(tab[j]=='P')
            g = pioche;
        else
            g = rien;

        setTypeCase(&pPlat->tab[i],g);

    }

}

bool verifPosition(const int taille, const int positionf)
{
    if(taille == positionf)
        return 2;
    else if(positionf > taille)
        return 1;
    else
        return 0;
}

bool verifCredit(const int total, const int score)
{
    if(score >= total)
        return 1;
    else
        return 0;
}

void repartirQuest(Plateau * pla, ListeTempQ * liste)
{
    int i;
    int nbrcases = get_capacitePlat(pla);
    int nbrquest = nbrElementListeQ(liste);
    int nbralea;
    for(i=1;i<nbrcases;i++)
    {
        if(pla->tab[i].type == 0)
        {
            nbralea = nbrAleatoire(nbrquest);
            pla->tab[i].action = creerQuestion();
            copierQuest(pla->tab[i].action,&liste->tab[nbralea]);
            supprimerElementListe(liste,nbralea);
            nbrquest = nbrElementListeQ(liste);
        }
    }
}

void platTestRegression()
{
    int niveau = 3;
    int capacite = 0;
    Plateau *pPlat = creerPlateau(8,1);

    printf("=Test De Regression=\n");
    assert(pPlat->niveau == 0);

    printf("niveau = %d \n",pPlat->niveau);
    printf("num_case = %d \n",pPlat->num_case);
    set_niveau(pPlat,niveau);
    niveau = get_niveau(pPlat);
    printf("niveau après appel a set_niveau = %d \n",niveau);
    capacite = get_capacitePlat(pPlat);
    printf("num_case après init = %d \n",capacite);

    int j;
    for(j=0;j<pPlat->num_case;j++)
    {
        printf("les types des case%d %d \n",j,getTypeCase(&pPlat->tab[j]));
    }

    detruitPlateau(&pPlat);
    printf("=Fin Test De Regression: OK =\n");

}
